﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAO.DBSystem;
using System.Data;
using System.Collections;
using PlusArquivosDigitais.Entidades;

namespace PlusArquivosDigitais.DAO.DBSystem
{
    public class DAODBSystem
    {
        public DAODBSystem() { }

        public static List<string> ObterListaSGBD()
        {
            List<string> lst = new List<string>();

            try
            {
                CEMSDataAccess db = new CEMSDataAccess();
                DataTable dt = db.ExecutaConsulta("ObterSGBD", null);
                foreach (DataRow dr in dt.Rows)
                {
                    lst.Add(dr["Banco"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return lst;
        }
        
        public static bool InserirConexao(Entidades.ConfigConexao obj)
        {
            bool retorno = false;

            if (DeletarStrConn() == false)
            {
                retorno = false;
            }
            else
            {
                try
                {
                    Hashtable htParametros = new Hashtable();
                    htParametros["@idDb"] = obj.IdBanco;
                    htParametros["@strConexao"] = obj.StrConn;
                    htParametros["@user"] = obj.User;
                    htParametros["@senha"] = obj.Senha;
                    htParametros["@serverName"] = obj.ServerName;
                    htParametros["@DataBase"] = obj.DataBase;

                    CEMSDataAccess db = new CEMSDataAccess();
                    db.ExecutaAtualizacao("InserirStringConn", htParametros);
                    retorno = true;
                }
                catch (Exception ex)
                {
                    retorno = false;
                    throw new Exception(ex.Message);
                }
            }
            return retorno;
        }

        public static int ObterIdBanco(string banco)
        {
            int retorno = 0;
            try
            {
                Hashtable htParametros = new Hashtable();
                htParametros["@banco"] = banco;

                CEMSDataAccess db = new CEMSDataAccess();
                DataTable dt = db.ExecutaConsulta("ObterIdSGBD", htParametros);

                foreach (DataRow dr in dt.Rows)
                {
                    retorno = int.Parse(dr["IdBanco"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return retorno;
        }

        private static bool DeletarStrConn()
        {
            bool retorno = false;
            try
            {
                CEMSDataAccess db = new CEMSDataAccess();
                db.ExecutaAtualizacao("DeleteStringConn", null);
                retorno = true;
            }
            catch (Exception ex)
            {
                retorno = false;
                throw new Exception(ex.Message);
            }
            return retorno;
        }

        public static Entidades.ConfigConexao ObterDadosDeConexao()
        {
            Entidades.ConfigConexao obj = new PlusArquivosDigitais.Entidades.ConfigConexao();
            try
            {
                CEMSDataAccess db = new CEMSDataAccess();
                DataTable dt = db.ExecutaConsulta("ObterConexao", null);
                foreach (DataRow dr in dt.Rows)
                {
                    obj.IdBanco = int.Parse(dr["IdBanco"].ToString());
                    obj.ServerName = dr["ServerName"].ToString();
                    obj.User = dr["Usuario"].ToString();
                    obj.Senha = dr["Senha"].ToString();
                    obj.StrConn = dr["StringConn"].ToString();
                    obj.DataBase = dr["dataBase"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return obj;
        }

        public static string ObterNomeDoSGBD(int idBanco)
        {
            string retorno = string.Empty;
            try
            {
                Hashtable htParametro = new Hashtable();
                htParametro["@IdBanco"] = idBanco;

                CEMSDataAccess db = new CEMSDataAccess();
                DataTable dt = db.ExecutaConsulta("ObterNomeSGBD", htParametro);
                foreach (DataRow dr in dt.Rows)
                {
                    retorno = dr["Banco"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return retorno;
        }

        /// <summary>
        /// Método responsável em passar a ConnectionString
        /// configurada pelo administrador.
        /// </summary>
        /// <returns>ConnectionString</returns>
        public static string ObterStringConexaoConfigurada()
        {
            string retorno = string.Empty;
            try
            {
                CEMSDataAccess db = new CEMSDataAccess();
                DataTable dt = db.ExecutaConsulta("ObterConexao", null);
                foreach (DataRow dr in dt.Rows)
                {
                    retorno = dr["StringConn"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return retorno;
        }

        /// <summary>
        /// Obter Banco e String de conexão configurada
        /// para o banco padrão.
        /// </summary>
        public static ConfigConexao ObterDBStringConexao() 
        {
            ConfigConexao retorno = new ConfigConexao();
            try
            {
                CEMSDataAccess db = new CEMSDataAccess();
                DataTable dt = db.ExecutaConsulta("QryObterBancoString", null);

                foreach (DataRow dr in dt.Rows)
                {
                    retorno.StrConn = dr["StringConn"].ToString();
                    retorno.IdBanco = int.Parse(dr["IdBanco"].ToString());
                }
            }
            catch (Exception ex)
            {                
                throw new Exception(ex.Message);
            }

            return retorno;
        }
    }
}
